home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Main.bin / reflect.h < prev    next >
C/C++ Source or Header  |  1998-09-15  |  6KB  |  242 lines

  1. /*
  2.  * @(#)reflect.h    1.24 98/07/01
  3.  *
  4.  * Copyright 1995-1998 by Sun Microsystems, Inc.,
  5.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  6.  * All rights reserved.
  7.  * 
  8.  * This software is the confidential and proprietary information
  9.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  10.  * shall not disclose such Confidential Information and shall use
  11.  * it only in accordance with the terms of the license agreement
  12.  * you entered into with Sun.
  13.  */
  14.  
  15. #ifndef    _REFLECT_H
  16. #define    _REFLECT_H
  17.  
  18. #include "oobj.h"
  19. #include "native.h"
  20.  
  21. /*
  22.  * Keep consistent with constants in java.lang.reflect.Member
  23.  */
  24. enum { MEMBER_PUBLIC, MEMBER_DECLARED };
  25.  
  26. extern HObject *    reflect_field(ClassClass *, char *, long);
  27. extern HArrayOfObject *    reflect_fields(ClassClass *, long);
  28.  
  29. extern HObject *    reflect_method(ClassClass *, char *, HArrayOfObject *,
  30.                 long);
  31. extern HArrayOfObject *    reflect_methods(ClassClass *, long);
  32.  
  33. extern HObject *    reflect_constructor(ClassClass *, HArrayOfObject *,
  34.                 long);
  35. extern HArrayOfObject *    reflect_constructors(ClassClass *, long);
  36.  
  37. extern ClassClass *    reflect_find_class(char *, ClassClass *, char **);
  38. extern bool_t        reflect_check_access(ExecEnv *, ClassClass *, int,
  39.                 ClassClass *);
  40. extern HObject *    reflect_new_array(ClassClass *, int);
  41. extern HArrayOfObject *    reflect_new_class_array(int);
  42. extern bool_t        reflect_is_assignable(ClassClass *, ClassClass *,
  43.                 ExecEnv *);
  44.  
  45. /*
  46.  * Implementation
  47.  */
  48.  
  49. #ifdef _REFLECT_IMPL
  50.  
  51. /*
  52.  * "Generic" accessors for Field, Method, Constructor
  53.  */
  54. #define    member_class(h)        (unhand(h)->clazz)
  55. #define    member_slot(h)        (unhand(h)->slot)
  56. #define    member_name(h)        (unhand(h)->name)
  57. #define    member_type(h)        (unhand(h)->type)
  58. #define    member_returnType(h)    (unhand(h)->returnType)
  59. #define    member_parameterTypes(h)(unhand(h)->parameterTypes)
  60. #define    member_exceptionTypes(h)(unhand(h)->exceptionTypes)
  61.  
  62.  
  63. #define    REFLECT_GET(p, pCode, v, packed)                \
  64. if (TRUE)                                \
  65. {                                    \
  66.     switch (pCode) {                            \
  67.     case T_BOOLEAN:                            \
  68.     case T_BYTE:                            \
  69.     if (packed) { v.i = *(char *) (p); break; }            \
  70.     case T_CHAR:                            \
  71.     if (packed) { v.i = *(unicode *) (p); break; }            \
  72.     case T_SHORT:                            \
  73.     if (packed) { v.i = *(short *) (p); break; }            \
  74.     case T_INT:                                \
  75.     v.i = *(long *) (p); break;                    \
  76.     case T_FLOAT:                            \
  77.     v.f = *(float *) (p); break;                    \
  78.     case T_LONG:                            \
  79.     v.l = GET_INT64(v, p); break;                    \
  80.     case T_DOUBLE:                            \
  81.     v.d = GET_DOUBLE(v, p); break;                    \
  82.     default:                                \
  83.     v.h = *(HObject **) (p);                    \
  84.     }                                    \
  85. } else
  86.  
  87. #define    REFLECT_SET(p, pCode, v, packed)                \
  88. if (TRUE)                                \
  89. {                                    \
  90.     switch (pCode) {                            \
  91.     case T_BOOLEAN:                            \
  92.     case T_BYTE:                            \
  93.     if (packed) { *(char *) (p) = v.i; break; }            \
  94.     case T_CHAR:                            \
  95.     if (packed) { *(unicode *) (p) = v.i; break; }            \
  96.     case T_SHORT:                            \
  97.     if (packed) { *(short *) (p) = v.i; break; }            \
  98.     case T_INT:                                \
  99.     *(long *) (p) = v.i ; break;                    \
  100.     case T_FLOAT:                            \
  101.     *(float *) (p) = v.f; break;                    \
  102.     case T_LONG:                            \
  103.     SET_INT64(v, p, v.l); break;                    \
  104.     case T_DOUBLE:                            \
  105.     SET_DOUBLE(v, p, v.d); break;                    \
  106.     default:                                \
  107.     *(HObject **) (p) = v.h;                    \
  108.     }                                    \
  109. } else
  110.  
  111. #define    REFLECT_WIDEN(v, vCode, wCode, fail)                \
  112. if (TRUE)                                \
  113. {                                    \
  114.     switch(wCode) {                            \
  115.     case T_BOOLEAN:                            \
  116.     case T_BYTE:                            \
  117.     case T_CHAR:                            \
  118.     goto fail;                            \
  119.     case T_SHORT:                            \
  120.     switch (vCode) {                        \
  121.     case T_BYTE:                            \
  122.         break;                            \
  123.     default:                            \
  124.         goto fail;                            \
  125.     }                                \
  126.     break;                                \
  127.     case T_INT:                                \
  128.     switch (vCode) {                        \
  129.     case T_BYTE:                            \
  130.     case T_CHAR:                            \
  131.     case T_SHORT:                            \
  132.         break;                            \
  133.     default:                            \
  134.         goto fail;                            \
  135.     }                                \
  136.     break;                                \
  137.     case T_LONG:                            \
  138.     switch (vCode) {                        \
  139.     case T_BYTE:                            \
  140.     case T_CHAR:                            \
  141.     case T_SHORT:                            \
  142.     case T_INT:                            \
  143.         v.l = int2ll(v.i); break;                        \
  144.     default:                            \
  145.         goto fail;                            \
  146.     }                                \
  147.     break;                                \
  148.     case T_FLOAT:                            \
  149.     switch (vCode) {                        \
  150.     case T_BYTE:                            \
  151.     case T_CHAR:                            \
  152.     case T_SHORT:                            \
  153.     case T_INT:                            \
  154.         v.f = (float) v.i; break;                    \
  155.     case T_LONG:                            \
  156.         v.f = (float) ll2float(v.l); break;                    \
  157.     default:                            \
  158.         goto fail;                            \
  159.     }                                \
  160.     break;                                \
  161.     case T_DOUBLE:                            \
  162.     switch (vCode) {                        \
  163.     case T_BYTE:                            \
  164.     case T_CHAR:                            \
  165.     case T_SHORT:                            \
  166.     case T_INT:                            \
  167.         v.d = (double) v.i; break;                    \
  168.     case T_FLOAT:                            \
  169.         v.d = (double) v.f; break;                    \
  170.     case T_LONG:                            \
  171.         v.d = (double) ll2double(v.l); break;                    \
  172.     default:                            \
  173.         goto fail;                            \
  174.     }                                \
  175.     break;                                \
  176.     default:                                \
  177.     goto fail;                            \
  178.     }                                    \
  179. } else
  180.  
  181. /*
  182.  *
  183.  */
  184.  
  185. #define    REFLECT_ERROR(nm, det)                        \
  186.     SignalError(0, JAVAPKG #nm, det)
  187.  
  188. #define    OutOfMemoryError()                        \
  189.     REFLECT_ERROR(OutOfMemoryError, 0)
  190.  
  191. #define    NullPointerException()                        \
  192.     REFLECT_ERROR(NullPointerException, 0)
  193.  
  194. #define    InternalError(det)                        \
  195.     REFLECT_ERROR(InternalError, det)
  196.  
  197. /*
  198.  *
  199.  */
  200.  
  201. #define    ENSURE_RESOLVED(cb)                        \
  202.     if (!CCIs(cb, Resolved)) {                        \
  203.     char   *detail = NULL;                        \
  204.     char   *exception = ResolveClass(cb, &detail);            \
  205.     if (exception != NULL) {                    \
  206.         SignalError(0, exception, detail);                \
  207.         return NULL;                        \
  208.     }                                \
  209.     }
  210.  
  211. /*
  212.  *
  213.  */
  214.  
  215. #define    fbClass(fb)    (fb->clazz)
  216. #define    fbName(fb)    (fb->name)
  217. #define    fbSig(fb)    (fb->signature)
  218. #define    fbAccess(fb)    (fb->access)
  219. #define    fbID(fb)    (fb->ID)
  220. #define    fbIsArray(fb)    (fbSig(fb)[0] == SIGNATURE_ARRAY)
  221. #define    fbIsClass(fb)    (fbSig(fb)[0] == SIGNATURE_CLASS)
  222. #define    fbIsPublic(fb)    ((fbAccess(fb) & ACC_PUBLIC) != 0)
  223. #define    fbIsStatic(fb)    ((fbAccess(fb) & ACC_STATIC) != 0)
  224. #define    fbIsFinal(fb)    ((fbAccess(fb) & ACC_FINAL) != 0)
  225. #define    fbOffset(fb)    (fb->u.offset)
  226.  
  227. #define    mbFb(mb)    (&mb->fb)
  228. #define    mbClass(mb)    (mb->fb.clazz)
  229. #define    mbName(mb)    (mb->fb.name)
  230. #define    mbSig(mb)    (mb->fb.signature)
  231. #define    mbAccess(mb)    (mb->fb.access)
  232. #define    mbOffset(mb)    (mb->fb.u.offset)
  233. #define    mbID(mb)    (mb->fb.ID)
  234. #define    mbArgsSize(mb)    (mb->args_size)
  235. #define    mbIsSpecial(mb)    (mbName(mb)[0] == '<')
  236. #define    mbIsPublic(mb)    ((mbAccess(mb) & ACC_PUBLIC) != 0)
  237. #define    mbIsStatic(mb)    ((mbAccess(mb) & ACC_STATIC) != 0)
  238.  
  239. #endif /* _REFLECT_IMPL */
  240.  
  241. #endif /* _REFLECT_H */
  242.